#include <cstdlib>
#include "algostuff.h"
using namespace std;

bool absLess(int elem1, int elem2)
{
	return abs(elem1) < abs(elem2);
}

/*
 * If more than one minimum or maximum element exists,
 * min_element() and max_element() return the first found;
 * minmax_element() returns the first minimum but the last maximum element, 
 * so max_element() and minmax_element() don't yield the same maximum element
 */
void min_max()
{
	deque<int> coll;

	INSERT_ELEMENTS(coll, 2, 6);
	INSERT_ELEMENTS(coll, -3, 6);

	PRINT_ELEMENTS(coll);

	// process and print minimun and maximum
	cout << "minimum: "
		<< *min_element(coll.cbegin(), coll.cend())
		<< endl;
	cout << "maximum: "
		<< *max_element(coll.cbegin(), coll.cend())
		<< endl;

	// print min and max and their distance using minmax_element()
	auto mm = minmax_element(coll.cbegin(), coll.cend());
	cout << "min: " << *(mm.first) << endl;
	cout << "max: " << *(mm.second) << endl;
	cout << "distance: " << distance(mm.first, mm.second) << endl;

	// process and print minimum and maximum of absolute values
	cout << "minimum of absolute values: "
		<< *min_element(coll.cbegin(), coll.cend(), absLess)
		<< endl;
	cout << "maximum of absolute values: "
		<< *max_element(coll.cbegin(), coll.cend(), absLess)
		<< endl;
}